﻿using System;
using Tibet.Datos.Interfaces;
using Tibet.Entidades;
using System.Data.SqlClient;
using Tibet.Datos.FabricaDatos;
using System.Text;

namespace Tibet.Datos.DaosSqlServer
{
   public class DaoSqlServerAccesoUsuario:IDaoAccesoUsuario
    {
       IDaoAccesoConexion bd = FabricaConexion.DaoSqlServerAccesoConexion();

       public DaoSqlServerAccesoUsuario()
       {

       }

       /// <summary>
       /// Inserta un nuevo usuario en la base de datos
       /// </summary>
       /// <param name="usuario">Usuario a insertar</param>
       /// <returns>Si la creación fue exitosa o no</returns>
       public bool InsertarUsuario( Usuario usuario )
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[INSUsuario]";
               command.CommandTimeout = 10;

               command.Parameters.AddWithValue( "@Nombre", usuario.Nombre );
               command.Parameters.AddWithValue( "@Apellido",
                   usuario.Apellido );
               command.Parameters.AddWithValue( "@Email", usuario.Email );

               SqlDataReader reader = command.ExecuteReader();

               reader.Close();
               bd.CerrarConexionBd();
               return true;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return false;
           }
       }

       /// <summary>
       /// Modifica el usuario recibido como parámetro
       /// </summary>
       /// <param name="usuario">Usuario a modificar</param>
       /// <returns>Si la modificación fue exitosa o no</returns>
       public bool ModificarUsuario( Usuario usuario )
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[UPDUsuario]";
               command.CommandTimeout = 10;

               command.Parameters.AddWithValue( "@NombreUsuario",
                   usuario.Credencial.NombreUsuario );
               command.Parameters.AddWithValue( "@Nombre", usuario.Nombre );
               command.Parameters.AddWithValue( "@Apellido",
                   usuario.Apellido );
               command.Parameters.AddWithValue( "@Email", usuario.Email );

               SqlDataReader reader = command.ExecuteReader();

               reader.Close();
               bd.CerrarConexionBd();
               return true;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return false;
           }
       }

       /// <summary>
       /// Busca un usuario por su nombre de usuario
       /// </summary>
       /// <param name="nombreUsuario">
       /// Nombre de usuario del usuario a buscar
       /// </param>
       /// <returns>Usuario encontrado</returns>
       public Usuario BuscarUsuario( string nombreUsuario )
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[SELUsuarioXalias]";
               command.CommandTimeout = 10;
               
               command.Parameters.AddWithValue( "@NombreUsuario",
                   nombreUsuario );

               SqlDataReader reader = command.ExecuteReader();

               Usuario usuario = null;
               if ( reader.Read() )
               {
                   Credencial credencial = new Credencial
                       ( reader[ 1 ].ToString(), reader[ 4 ].ToString() );

                   usuario = new Usuario( reader[ 2 ].ToString(), "",
                       reader[ 3 ].ToString(), "", reader[ 5 ].ToString(), 1,
                       credencial, null );
                   usuario.IdUsuario = int.Parse( reader[ 0 ].ToString() );
               }

               reader.Close();
               bd.CerrarConexionBd();

               return usuario;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return null;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return null;
           }
       }

       /// <summary>
       /// Verifica si el usuario se encuentra registrado
       /// </summary>
       /// <param name="usuario">Usuario a buscar</param>
       /// <returns>Si el usuario existe o no</returns>
       public bool ExisteUsuario( Usuario usuario )
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[SELUsuarioXaliasYcorreo]";
               command.CommandTimeout = 10;

               command.Parameters.AddWithValue( "@NombreUsuario",
                   usuario.Credencial.NombreUsuario );
               command.Parameters.AddWithValue( "@Email",
                   usuario.Email );

               SqlDataReader reader = command.ExecuteReader();

               if ( reader.Read() )
                   return true;

               reader.Close();
               bd.CerrarConexionBd();
               return false;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return false;
           }
       }

       /// <summary>
       /// Elimina el usuario recibido como parámetro
       /// </summary>
       /// <param name="usuario">Usuario a eliminar</param>
       /// <returns>Si la eliminación fue exitosa o no</returns>
       public bool EliminarUltimoUsuario( Usuario usuario )
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[DELUltimoUsuario]";
               command.CommandTimeout = 10;

               SqlDataReader reader = command.ExecuteReader();

               reader.Close();
               bd.CerrarConexionBd();
               return true;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return false;
           }
       }

       /// <summary>
       /// Busca los últimos 5 proyectos culminados
       /// </summary>
       /// <returns>Proyectos encontrados</returns>
       public StringBuilder BuscarProyectos()
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[SELUltimosProyectos]";
               command.CommandTimeout = 10;

               SqlDataReader reader = command.ExecuteReader();

               StringBuilder sb = new StringBuilder();
               sb.Append( "<table align=center width=85% border=1>" );
               sb.Append( "<tr bgcolor=#CCCCCC>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Proyecto</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Cliente</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Líder</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Fecha inicio</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Fecha fin</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Status</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Reglas</b></font></td>" +
                    "<td width=13% align=center><font size=\"-2\">" +
                        "<b>Métricas</b>" +
                    "</font></td></tr>" );

               while ( reader.Read() )
               {
                   sb.Append( "<tr><td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 0 ] + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 1 ] + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 2 ] + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" +
                       reader[ 3 ].ToString().Remove( 11 ) + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" +
                       reader[ 4 ].ToString().Remove( 11 ) + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 5 ] + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 6 ] + "</font></td>" +

                       "<td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 7 ] +
                       "</font></td></tr>" );
               }
               sb.Append( "</table>" );

               reader.Close();
               bd.CerrarConexionBd();

               return sb;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return null;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return null;
           }
       }
       /// <summary>
       /// Busca los ultimos 5 perfiles de Metrica
       /// </summary>
       /// <returns></returns>
       public StringBuilder BuscarPerfilesMetrica()
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[SELPerfilesMetrica]";
               command.CommandTimeout = 10;

               SqlDataReader reader = command.ExecuteReader();
               StringBuilder sb = new StringBuilder();
               sb.Append("<table align=center width=20% border=1>");
               sb.Append("<tr bgcolor=#CCCCCC>" +
                    "<td width=13% align=center><font color=\"black\" size=\"-2\"><b>Nombre del Perfil de Metrica</b></font></td></tr>");

               while (reader.Read())
               {
                   sb.Append("<tr><td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font color=\"black\" size=\"-2\">" + reader[0] + "</font></td></tr>");
               }
               sb.Append( "</table>" );

               reader.Close();
               bd.CerrarConexionBd();

               return sb;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return null;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return null;
           }
       }

       /// <summary>
       /// Busca los ultimos 5 perfiles de regla
       /// </summary>
       /// <returns></returns>
       public StringBuilder BuscarPerfilesReglas()
       {
             
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[SELPerfilesRegla]";
               command.CommandTimeout = 10;

               SqlDataReader reader = command.ExecuteReader();
               StringBuilder sb = new StringBuilder();
               sb.Append( "<table align=center width=20% border=1>" );
               sb.Append( "<tr bgcolor=#CCCCCC>" +
                    "<td width=13% align=center><font size=\"-2\"><b>Nombre del Perfil de Regla</b></font></td></tr>" );

               while ( reader.Read() )
               {
                   sb.Append( "<tr><td align=center style=\"border-top:0; " +
                       "border-bottom:0; border-left:0; border-right:0\">" +
                       "<font size=\"-2\">" + reader[ 0 ] + "</font></td></tr>" );
               }
               sb.Append( "</table>" );

               reader.Close();
               bd.CerrarConexionBd();

               return sb;
           } catch ( SqlException )
           {
               bd.CerrarConexionBd();
               return null;
           } catch ( Exception )
           {
               bd.CerrarConexionBd();
               return null;
           }
       }


       #region Integracion SVN
       /// <summary>
       /// Devuelve el correo del usuario
       /// </summary>
       /// <param name="usuario"></param>
       /// <returns></returns>
       public string FuncConsultarCorreo(string usuario)
       {
           SqlCommand command = new SqlCommand();

           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
               command.CommandText = "[dbo].[SELCorreoElectronico.sql]"; // Nombre del Procedimiento Almacenado en la Base de Datos
               command.CommandTimeout = 10;

               command.Parameters.AddWithValue("@usernameUsuario", usuario);
               SqlDataReader reader = command.ExecuteReader();

               while (reader.Read())
               {
                   string strUsuario = Convert.ToString(reader.GetValue(0));
                   return strUsuario;
               }

               reader.Close();
               bd.CerrarConexionBd();
               return "Error";
           }

           catch (SqlException)
           {
               bd.CerrarConexionBd();
               return "Error";
           }

           catch (Exception)
           {
               bd.CerrarConexionBd();
               return "Error";
           }
       }
       #endregion







    }
}
